home *** CD-ROM | disk | FTP | other *** search
- /* tools.c: 12-Jan-96 */
- #include "net.h"
-
- /****************************************************************
- * (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
- ****************************************************************/
-
- int key_pressed(void)
- {
- REGS regsin, regsout;
- regsin.h.ah = 0x01; /* read key-press */
- int86(0x16, ®sin, ®sout);
- return((regsout.x.flags & 0x40) ? 0 : 1); /* zeroflag != 0 */
- }
-
- void clear_kb(void)
- {
- REGS regsin, regsout;
- while (key_pressed()) { /* zeroflag != 0 */
- regsin.h.ah = 0x00; /* read key-press */
- int86(0x16, ®sin, ®sout);
- }
- }
-
- int ask_user(char *p, ...)
- {
- int key;
- int flag = 0;
- va_list argptr;
- va_start(argptr, p);
- vfprintf(stderr, p, argptr);
- va_end(argptr);
- fprintf(stderr, "\n Please answer: Y)es or N)o!");
- while (1) {
- key = getch();
- if (key == 'J' || key == 'j' || key== 'y' || key == 'Y') {
- fprintf(stderr, "Y\n\n");
- flag = 1;
- break;
- }
- if (key == 'N' || key == 'n') {
- fprintf(stderr, "N\n\n");
- flag = 0;
- break;
- }
- }
- clear_kb();
- return(flag);
- }
-
- char *xmalloc(uint size)
- {
- char *p = (size) ? (char *)malloc(size) : (char*)NULL;
- if (p == (char *)NULL && size){
- fprintf(stderr, "not enough core, need %d Bytes\n", size);
- exit(1);
- }
- return(p);
- }
-
- char *xcmalloc(uint size)
- {
- char *p = xmalloc(size);
- if (size) memset(p, 0, size);
- return(p);
- }
-
- void x_x_xfree(char **p)
- {
- if (*p != (char *)NULL){
- free(*p);
- *p = (char*)NULL;
- }
- }
-
- int strmaxcpy(char *dest, char *source, int len)
- /* copied max. len chars + '\0' Byte */
- {
- int slen = (source != (char *)NULL) ? min(len, strlen(source)) : 0;
- if (dest == (char *)NULL) return(0);
- if (slen) memcpy(dest, source, slen);
- dest[slen] = '\0';
- return(slen);
- }
-
- char *xadd_char(char *s, int c, int maxlen)
- {
- if (s && maxlen) {
- int namlen = strlen(s);
- if (maxlen > -1 && namlen >= maxlen) namlen=maxlen-1;
- s[namlen++] = c;
- s[namlen] = '\0';
- }
- return(s);
- }
-
- static uint8 down_char(uint8 ch)
- {
- if (ch > 64 && ch < 91) return(ch + 32);
- switch(ch){
- case 142: ch = 132; break;
- case 153: ch = 148; break;
- case 154: ch = 129; break;
- default :break;
- }
- return(ch);
- }
-
- static uint8 up_char(uint8 ch)
- {
- if (ch > 96 && ch < 123) return(ch - 32);
- switch(ch) {
- case 132: ch = 142; break;
- case 148: ch = 153; break;
- case 129: ch = 154; break;
- default : break;
- }
- return(ch);
- }
-
- uint8 *upstr(uint8 *s)
- {
- if (!s) return((uint8*)NULL);
- for (;*s;s++) *s=up_char(*s);
- return(s);
- }
-
- void deb(uint8 *s)
- {
- if (!s || !*s) return;
- else {
- uint8 *p = s + strlen(s);
- while (p > s && (*--p==32 || *p==9));;
- if (*p==32 || *p==9) *p='\0';
- else *(p+1) = '\0';
- }
- }
-
- void leb(uint8 *s)
- {
- if (!s || !*s || (*s != 32 && *s != 9)) return;
- else {
- uint8 *p = s;
- for (;*p && *p!=32 && *p!=9;p++);;
- strcpy(s, p);
- }
- }
-
- void korrpath(char *s)
- {
- if (!s) return;
- for (;*s;s++) {
- if (*s=='\\') *s='/';
- else *s=down_char(*s);
- }
- }
-
- void get_path_fn(char *s, char *p, char *fn)
- {
- int j= strlen(s);
- if (p != (char *)NULL) p[0] = 0;
- if (fn != (char*) NULL) fn[0] = 0;
- if (!j) return;
- if (s[0] == '.' && (s[1] == 0 || (s[1] == '.' && s[2] == 0) ) ) {
- if (p != (char *)NULL) {
- strcpy(p, s);
- strcat(p, "/");
- }
- if (fn != (char *)NULL) fn[0] = 0;
- return;
- }
- while (j--){
- if ((s[j] == '/') || (s[j] == ':') ) {
- if (fn != (char *)NULL) strcpy(fn, s+j+1);
- if (p != (char *)NULL) {
- strncpy(p, s, j+1);
- p[j+1] = 0;
- }
- return;
- }
- }
- if (fn != (char *)NULL) strcpy(fn, s); /* no path */
- }
-
-
- typedef struct {
- uint16 adr1;
- uint16 adr2;
- char reserve[6];
- uint32 ladrs[3];
- uint16 father_psp_seg;
- char handles[20];
- uint16 environ_seg;
- } PROG_PSP;
-
- typedef struct {
- uint8 kennung;
- uint16 prozess_seg;
- uint16 blocks;
- } SPEICH_BLOCK;
-
- static char *getglobenvironment(uint16 *maxsize, uint16 *aktsize)
- {
- static uint16 globmaxenvsize=0;
- static char *globenviron=NULL;
- if (globenviron == (char *) NULL) {
- PROG_PSP *mypsp = MK_FP(_psp, 0);
- PROG_PSP *fatherpsp = MK_FP(mypsp->father_psp_seg, 0);
- SPEICH_BLOCK *spb = MK_FP(fatherpsp->environ_seg-1, 0);
- globenviron = (char *)MK_FP(fatherpsp->environ_seg, 0);
- globmaxenvsize = spb->blocks * 16;
- }
- if (globmaxenvsize){
- char *search = globenviron;
- char *maxsearch = search+globmaxenvsize;
- while (*search && search < maxsearch) {
- int slen=strlen(search);
- search+=(slen+1);
- }
- *aktsize = max(2, (uint16)(search+1 - globenviron));
- } else *aktsize=0;
- *maxsize = globmaxenvsize;
- /*
- printf("globenv=%p maxsize=%d, aktsize=%d\n", globenviron, globmaxenvsize, *aktsize);
- */
- return(globenviron);
- }
-
- char *getglobenv(char *option)
- {
- uint16 maxenvsize;
- uint16 aktenvsize;
- char *search = getglobenvironment(&maxenvsize, &aktenvsize);
- int length = (option == NULL) ? 0 : strlen(option);
- if (aktenvsize && length){
- char *maxsearch=search+aktenvsize;
- while (*search && search < maxsearch) {
- int slen=strlen(search);
- if (slen > length && (*(search + length) == '=')
- && (strncmp(search, option, length) == 0)) {
- /*
- printf("GET GLOB %s=%s\n", option, search+length+1);
- */
- return(search + length + 1);
- }
- search+=(slen+1);
- }
- }
- return(NULL);
- }
-
- int putglobenv(char *option)
- {
- uint16 maxenvsize;
- uint16 aktenvsize;
- char *search = getglobenvironment(&maxenvsize, &aktenvsize);
- int optionlen = (option == NULL) ? 0 : strlen(option);
- /*
- printf("PUT GLOB option=%s\n", option);
- */
- if (optionlen && maxenvsize){
- int length;
- char *equal;
- for (equal = option; *equal && *equal != '='; equal++);;
- length = (int) (equal - option);
- if (length > 0 && *equal == '='){
- char *maxsearch=search+aktenvsize;
- while (*search && search < maxsearch) {
- int slen = strlen(search);
- char *nextp = search+slen+1;
- if (slen > length && (*(search + length) == '=')
- && (strncmp(search, option, length) == 0)) { /* gefunden */
- int diffsize = optionlen-slen;
- if (diffsize){
- int movesize = (int)(maxsearch - nextp);
- if (diffsize > (int)(maxenvsize - aktenvsize))
- return(-1); /* Kein Platz mehr */
- if (!*(equal+1)) diffsize -= (length+2);
- xmemmove(nextp+diffsize, nextp, movesize);
- }
- if (*(equal+1)) strcpy(search, option);
- return(0);
- }
- search=nextp;
- }
- /* nicht gefunden , nun eintragen, falls möglich */
- if (*(equal+1) && optionlen < maxenvsize - aktenvsize) {
- strcpy(search, option);
- *(search+optionlen+1) = '\0'; /* letzter Eintrag '\0' nicht vergessen */
- return(0);
- } else return(-1);
- }
- }
- return(-1);
- }
-
-